package com.example.demo.controller;
import com.github.pagehelper.PageInfo;
import com.example.demo.mapper.HdeUserMapper;
import com.example.demo.model.HdeUser;
import com.example.demo.model.HdeUserExample;
import com.example.demo.service.HdeUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Random;

@Controller
@RequestMapping("/hde-user")
public class HdeUserController {

    /**
     * 使用@Autowire不行，只能使用@Resource
     *
     * 相同点
     *   Spring都支持
     *   都可以作用在字段和setter方法上
     * 不同点
     *   Resource是JDK提供的，而Autowired是Spring提供的
     *   Resource不允许找不到bean的情况，而Autowired允许（@Autowired(required = false)）
     *   指定name的方式不一样，@Resource(name = "baseDao"),@Autowired()@Qualifier("baseDao")
     *   Resource默认通过name查找，而Autowired默认通过type查找
     *
     * Resource 的作用相当于@Autowired，只不过@Autowired按byType自动注入，而@Resource默认按 byName自动注入罢了。
     */
    @Resource
    private HdeUserMapper hdeUserMapper;

    @Autowired
    HdeUserService hdeUserService;


    /**
     * 测试查询操作
     *
     * 访问路径： http://localhost:8880/hde-user/find?name=UWwIpi
     *
     * @param name
     * @param model
     * @return
     */
    @GetMapping("/find")
    public String find(@RequestParam(name="name", required=true) String name,
                       Model model) {
        /**
         * HdeUserExample 是一个支持动态sql拼接的类
         *
         * HdeUserExample.Criteria 可以使用java代码拼接条件语句
         */
        HdeUserExample example = new HdeUserExample();
        HdeUserExample.Criteria criteria = example.createCriteria();

        if(!StringUtils.isNotBlank(name)){
            criteria.andNameEqualTo(name);
        }

        List<HdeUser> userList = hdeUserMapper.selectByExample(example);
        if(!userList.isEmpty()) {
            /**
             * 通过此方式传递给视图
             */
            model.addAttribute("student", userList.get(0));
        }

        return "hde_user";
    }

    @RequestMapping("/userlist")
    @ResponseBody
    public PageInfo<HdeUser> getUserList(Model model, PageInfo pageInfo){
        int pageNum  = (pageInfo.getPageNum() == 0)? 1 : pageInfo.getPageNum();
        int pageSize  = (pageInfo.getPageSize() == 0)? 10 : pageInfo.getPageSize();
        PageInfo<HdeUser> result = hdeUserService.selectAll(pageNum, pageSize);
        return result;
    }


    /**
     * 新增操作
     *
     * 访问路径： http://localhost:8880/hde-user/add
     *
     * @return
     */
    @PostMapping("/add")
    public String add(Model model, @RequestParam Map<String, Object> paramMap) {
        System.out.println("add paramMap:" + paramMap);
        HdeUser user = generateRandomUser();

        /* inserSelective就会只给有值的字段赋值（会对传进来的值做非空判断） */
        //int id = hdeUserMapper.insertSelective(user);

        /**insert 所有的字段都会添加一遍即使没有值 */
        int affectCount = hdeUserMapper.insert(user);

        /*insert的返回值是影响的行数，会把新增的id放入参数对象中，也就是通过user.getId()获得新增记录的id*/
        model.addAttribute("addResult", String.format("affectCount: %s, id: %s", affectCount, user.getId()));
        return "hde_user";
    }


    /**
     * length用户要求产生字符串的长度
     * @param length
     * @return
     */
    public static String randomStr(int length){
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < length; i++){
            int number = random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }

    private HdeUser generateRandomUser() {
        Random random = new Random();
        /*LocalDateTime 是jdk8推荐的日期处理类*/
        LocalDateTime now = LocalDateTime.now();

        HdeUser user = new HdeUser();
        user.setCreator("Huxiao");
        user.setGmtCreated(now);
        user.setModifier("Huxiao");
        user.setGmtModified(now);
        user.setIsDeleted("n");

        user.setAge((byte)random.nextInt(100));
        user.setName(randomStr(random.nextInt(8)));
        user.setRemark("");
        user.setSalary(new BigDecimal(random.nextInt(10000)));
        user.setTags("tags");
        user.setYearOfWorking((short)random.nextInt(50));
        user.setVersion(1);
        return user;
    }
}